import {
	subscribeMessage
} from "@/libs/order";
import {
	getProvider
} from "@/utils";
import WechatJSSDK from "wechat-jssdk/dist/client.umd";
import {
	getWechatConfig,
	wechatAuth
} from "@/api/public";
import {
	parseQuery
} from "@/utils";
import cookie from "@/utils/store/cookie";
import store from "@/store";
import dayjs from "dayjs";

// 支付模块
export const weappPay = (option) => {
	console.log(option)
	return new Promise((resolve, reject) => {
		console.log(store.state.$deviceType)
		if (store.state.$deviceType == 'weixinh5') {
			setTimeout(() => {
				location.href = option.mweb_url;
			}, 100);
			resolve()
			return
		}
		
		if (store.state.$deviceType == 'weixin') {
			pay(option).then(() => {
					uni.showToast({
						title: '支付成功',
						icon: 'success',
						duration: 5000,
					});
					resolve()
				})
				.finally(res => {
				})
				.catch(function() {
					uni.showToast({
						title: '支付失败',
						icon: 'none',
						duration: 5000
					});
					reject()
				});
			return
		}
		// 吊起微信支付
		let orderInfo = {
			appid: option.appid,
			noncestr: option.noncestr,
			package: option.package,
			partnerid: option.partnerid,
			prepayid: option.prepayid,
			sign: option.sign,
			timestamp: option.timestamp + '',
		}
		
		console.log(orderInfo)
		// 调用只接口
		uni.requestPayment({
			provider: 'wxpay',
			...option,
			timestamp: orderInfo.timestamp,
			orderInfo,
			success: (success) => {
				console.log(success)
				uni.showToast({
					title: '支付成功',
					icon: 'success',
					duration: 5000,
				});
				let time = setTimeout(() => {
					clearTimeout(time)
					resolve(success)
				}, 3000)
				// #ifdef MP-WEIXIN
				subscribeMessage()
				// #endif
			},
			fail: (error) => {
				console.log(error)
				if (error.errMsg == 'requestPayment:fail cancel') {
					uni.showToast({
						title: '已取消支付',
						icon: 'none',
						duration: 5000
					});
				} else {
					uni.showToast({
						title: error || error.msg,
						icon: 'none',
						duration: 5000
					});
				}
				reject(error)
			}
		})
		// })
	})
}

const STATE_KEY = "wx_authorize_state";
const WX_AUTH = "wx_auth";
const BACK_URL = "login_back_url";
const LOGINTYPE = "loginType";
let instance;
let wechatObj;
let appId
let wechatLoading = false

export function wechat() {
	console.log('初始化微信配置')
	wechatLoading = false
	return new Promise((resolve, reject) => {
		if (instance) return resolve(instance);
		getWechatConfig()
			.then(res => {
				console.log(res.data)
				const _wx = WechatJSSDK(res.data);
				console.log(_wx)
				appId = res.data.appId
				wechatObj = _wx;
				_wx
					.initialize()
					.then(() => {
						instance = _wx.wx;
						instance.initConfig = res.data;
						resolve(instance);
					})
					.catch(error => {
						console.log(error)
						uni.showToast({
							title: error,
							icon: "none",
							duration: 2000
						});
						reject()
					});
			})
			.catch(err => {
				console.log(err);
				reject();
			});
	});
}

export function clearAuthStatus() {
	cookie.remove(WX_AUTH);
	cookie.remove(STATE_KEY);
}

export async function oAuth() {
	console.log('处理微信授权')
	console.log(store)
	console.log(store.state)
	return new Promise((resolve, reject) => {
		// if (cookie.has(WX_AUTH)) {
		if (cookie.has(WX_AUTH) && store.state.token) {
			reject()
			return;
		}
		const {
			code
		} = parseQuery();
		if (!code) {
			toAuth();
			return
		} else {
			auth(code)
		}
		resolve()
	}).catch(error => {
		console.log(error)
	})
}

export async function auth(code) {
	console.log('获取微信授权')
	return new Promise((resolve, reject) => {
		let loginType = cookie.get(LOGINTYPE);
		let spread = cookie.get('spread');
		console.log('微信授权登录前获取spread', spread)
		wechatAuth(code, spread, loginType)
			.then(({
				data
			}) => {
				console.log(data)
				const expires_time = dayjs(data.expires_time);
				const newTime = Math.round(new Date() / 1000);
				store.commit("login", data.token, expires_time - newTime);
				cookie.set(WX_AUTH, code, expires_time);
				cookie.remove(STATE_KEY);
				loginType && cookie.remove(LOGINTYPE);
				console.log('微信公众号授权登录，获取用户信息')
				store.dispatch('getUser').finally(() => {
					resolve();
				})
			})
			.catch(reject);
	}).catch(error => {
		console.log(error)
	})
}

export async function toAuth() {
	if (wechatLoading) {
		return
	}
	wechatLoading = true
	wechat().then(wx => {
		location.href = getAuthUrl(appId);
	});
}

function getAuthUrl(appId) {
	cookie.set('redirect', window.location.href)
	const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index`);
	cookie.remove(BACK_URL);
	const state = 'STATE'
	cookie.set(STATE_KEY, state);
	return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`;
}

function toPromise(fn, config = {}) {
	return new Promise((resolve, reject) => {
		fn({
			...config,
			success(res) {
				resolve(res);
			},
			fail(err) {
				reject(err);
			},
			complete(err) {
				reject(err);
			},
			cancel(err) {
				reject(err);
			}
		});
	});
}

export function pay(config) {
	console.log(instance)
	return toPromise(instance.chooseWXPay, config);
}

export function openAddress() {
	return new Promise((resolve, reject) => {
		wechatEvevt("openAddress", {})
			.then(res => {
				resolve(res);
			})
			.catch(res => {
				if (res.is_ready) {
					res.wx.openAddress({
						fail(res) {
							reject(res);
						},
						success(res) {
							resolve(res);
						}
					});
				} else {
					reject(res);
				}
			});
	});
}

export function openShareAll(config) {
	config || {};
	config.type = config.type == undefined ? "link" : config.type;
	return new Promise(resolve => {
		getWechatConfig().then(res => {
			wechatObj.signSignature({
				nonceStr: res.data.nonceStr,
				signature: res.data.signature,
				timestamp: res.data.timestamp
			});
			instance = wechatObj.getOriginalWx();
			instance.ready(() => {
				instance.updateAppMessageShareData(config);
				instance.updateTimelineShareData(config);
				resolve();
			});
		});
	});
}

export function openShareAppMessage(config) {
	instance.updateAppMessageShareData(config);
	instance.onMenuShareAppMessage && instance.onMenuShareAppMessage(config);
}

export function openShareTimeline(config) {
	instance.updateTimelineShareData(config);
	instance.onMenuShareTimeline && instance.onMenuShareTimeline(config);
}

export function wechatEvevt(name, config) {
	return new Promise((resolve, reject) => {
		let wx;
		let configDefault = {
			fail(res) {
				if (wx) return reject({
					is_ready: true,
					wx: wx
				});
				getWechatConfig().then(res => {
					wechatObj.signSignature({
						nonceStr: res.data.nonceStr,
						signature: res.data.signature,
						timestamp: res.data.timestamp
					});
					wx = wechatObj.getOriginalWx();
					reject({
						is_ready: true,
						wx: wx
					});
				});
			},
			success(res) {
				resolve(res);
			}
		};
		Object.assign(configDefault, config);
		if (typeof instance !== "undefined") {
			instance.ready(() => {
				if (typeof name === "object") {
					name.forEach(item => {
						instance[item] && instance[item](configDefault);
					});
				} else instance[name] && instance[name](configDefault);
			});
		} else {
			getWechatConfig().then(res => {
				const _wx = WechatJSSDK(res.data);
				_wx.initialize().then(() => {
					instance = _wx.getOriginalWx();
					instance.ready(() => {
						if (typeof name === "object") {
							name.forEach(item => {
								instance[item] && instance[item](configDefault);
							});
						} else instance[name] && instance[name](configDefault);
					});
				});
			});
		}
	});
}

export function ready() {
	return new Promise(resolve => {
		if (typeof instance !== "undefined") {
			instance.ready(() => {
				resolve(instance);
			});
		} else {
			getWechatConfig().then(res => {
				const _wx = WechatJSSDK(res.data);
				_wx.initialize().then(() => {
					instance = _wx.wx;
					instance.ready(() => {
						resolve(instance);
					});
				});
			});
		}
	});
}
